package cn.ryh.rabbitmq.code.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.TimeoutException;

/**
 * @author Raoyh
 * @Description
 * @create 2022-07-08 17:04
 */
@Slf4j
public class Producer {
    public static void main(String[] args) {
        // 所有的中间件都是基于TCP/IP协议基础上构建新型的协议规范，只不过rabbitMQ遵循的是AMQP
        // ip port
        // 1、创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("47.98.34.119");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");
        factory.setPassword("XXXXXXX");
        Connection connection = null;
        Channel channel = null;
        try {
            // 2、创建连接Connection
            connection = factory.newConnection("生成者");
            // 3、通过连接创建通道Channel
            channel = connection.createChannel();
            // 4、通过通道Channel 创建交互机，声明队列，绑定关系，路由key,发生消息,接收消息
            String queueName = "simpleQueueName";
            /*
             *  如果队列不存在，则会创建
             *  Rabbitmq不允许创建两个相同的队列名称，否则会报错。
             *  @params1： queue 队列的名称
             *  @params2： durable 队列是否持久化
             *  @params3： exclusive 是否排他，即是否私有的，如果为true,会对当前队列加锁，其他的通道不能访问，并且连接自动关闭
             *  @params4： autoDelete 是否自动删除，当最后一个消费者断开连接之后是否自动删除消息。
             *  @params5： arguments 可以设置队列附加参数，设置队列的有效期，消息的最大长度，队列的消息生命周期等等。
             * */
            channel.queueDeclare(queueName, false, false, false, null);
            // 5、准备消息内容
            String message = "helle rabbitMQ simple";
            // 6、发送消息给队列Queue
            channel.basicPublish("", queueName, null, message.getBytes());
            log.info("消息发送成功");
        } catch (IOException | TimeoutException e) {
            e.printStackTrace();
        } finally {
            if (Objects.nonNull(channel) && channel.isOpen()) {
                try {
                    channel.close();
                } catch (IOException | TimeoutException e) {
                    e.printStackTrace();
                }
            }
            if (Objects.nonNull(connection)) {
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
